package com.itheima.d6_map_impl;

import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
import java.util.TreeSet;

/**
 * 目标：掌握TreeMap集合的使用。
 *
 * 特点：不重复、无索引、可排序(按照键的大小默认升序排序，只能对键排序)
 * 原理：TreeMap跟TreeSet集合的底层原理是一样的，都是基于红黑树实现的排序。
 *
 * TreeMap集合同样也支持两种方式来指定排序规则
 * 让类实现Comparable接口，重写比较规则。
 * TreeMap集合有一个有参数构造器，支持创建Comparator比较器对象，以便用来指定比较规则。
 */
public class Test3TreeMap {
    public static void main(String[] args) {
        /*源码
          public TreeSet() {
        this(new TreeMap<>());
    }
         */
        new TreeSet<>();

        //Map<Student,String> map = new TreeMap<>();

        /*
        TreeMap的源码，有参构造器：
        public TreeMap(Comparator<? super K> comparator) {
        this.comparator = comparator;
    }
    形参列表Comparator接口再点进去，源码：
    @FunctionalInterface
    public interface Comparator<T> {

    所以可以支持创建Comparator比较器对象，以便用来指定比较规则。
    此时如果也重写了自定义类里面的比较规则，那么会就近原则，选择使用Comparator比较器对象的规则

这里实现的Comparable接口，是lang包下面的。TreeMap集合有一个有参数构造器，支持创建Comparator比较器对象，是util包下面的
         */
        Map<Student, String> map = new TreeMap<>(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return Double.compare(o2.getHeight(), o1.getHeight());      //降序排序
            }
        });

        //把上面的简化为lambda表达式：
        //Map<Student, String> map = new TreeMap<>(( o1,  o2) ->   Double.compare(o2.getHeight(), o1.getHeight()));

        map.put(new Student("蜘蛛精", 25, 168.5), "盘丝洞");
        map.put(new Student("蜘蛛精", 25, 168.5), "水帘洞");
        map.put(new Student("至尊宝", 23, 163.5), "水帘洞");
        map.put(new Student("牛魔王", 28, 183.5), "牛头山");
        System.out.println(map);
    }
}
